/*
 * Copyright (C) hushenglan
 */

#ifndef _MYNET_TCPSOCK_H_
#define _MYNET_TCPSOCK_H_

namespace mynet
{

class CTcpSock: public CSock
{

public:

    /*
     * 连接状态
     */
    enum
    {
        MTNET_CONNECTING = 1,
        MTNET_CONNECTED,
        MTNET_CLOSED,
        MTNET_UNCONNECTED
    };

    /*
     * 构造函数，主动连接
     */
    CTcpSock(struct sockaddr_in remoteAddr);

    /*
     * 构造函数，被动连接
     */
    CTcpSock(int sock);

    /*
     * 析构函数
     */
    ~CTcpSock();

    /*
     * 连接到远程
     *
     * @return 是否成功
     */
    bool connect();

    /*
     * 获取socket状态
     *
     * @return 状态
     */
    int getSockStat();


    /*
     * 设置地址
     *
     * @param address  host或ip地址
     * @param port  端口号
     * @return 是否成功
     */
    bool setAddress(const char *address, const int port);

    /**
     * 关闭连接
     */
    void close();

    /*
     * 写数据
     */
    int write(const void *data, int len);

    /*
     * 读数据
     */
    int read(void *data, int len);

    /*
     * SetSoKeepAlive
     */
    bool setKeepAlive(bool on)
    {
        return setIntOption(SO_KEEPALIVE, on ? 1 : 0);
    }

    /*
     * setReuseAddress
     */
    bool setReuseAddress(bool on)
    {
        return setIntOption(SO_REUSEADDR, on ? 1 : 0);
    }

    /*
     * setSoLinger
     */
    bool setSoLinger(bool doLinger, int seconds);

    /*
     * setTcpNoDelay
     */
    bool setTcpNoDelay(bool noDelay);

    /*
     * setSoBlocking
     */
    bool setSoBlocking(bool on);

    /*
     * getSoError
     */
    int getSoError();

private:

    bool _getPeerAddr();
    int _status;
};

}

#endif
